using UnityEngine;
using UnityEngine.UI;
using System.Collections.Generic;
using TMPro;

public class InfiniteScrollList : MonoBehaviour
{
    public ScrollRect scrollRect; // ScrollRect 组件
    public RectTransform content; // Content 对象
    public GameObject itemPrefab; // 列表项预制体
    public int itemCount = 1000;  // 数据总量
    public int visibleItemCount = 5; // 可见的列表项数量

    private List<RectTransform> items = new List<RectTransform>(); // 当前显示的列表项
    private float itemHeight; // 每个列表项的高度
    private int currentIndex = 0; // 当前显示的第一个数据的索引

    void Start()
    {
        itemPrefab.SetActive(false);
        // 初始化列表项
        itemHeight = itemPrefab.GetComponent<RectTransform>().rect.height;
        for (int i = 0; i < visibleItemCount + 2; i++) // 多创建两个用于缓冲
        {
            GameObject item = Instantiate(itemPrefab, content);
            items.Add(item.GetComponent<RectTransform>());
            item.SetActive(true);
        }

        // 设置 Content 的高度
        content.sizeDelta = new Vector2(content.sizeDelta.x, itemHeight * itemCount);

        // 绑定滚动事件
        scrollRect.onValueChanged.AddListener(OnScroll);

        // 初始化列表项内容
        UpdateItems();
    }

    void OnScroll(Vector2 scrollPos)
    {
        // 计算当前显示的第一个数据的索引
        int newIndex = Mathf.FloorToInt(content.anchoredPosition.y / itemHeight);

        // 如果索引发生变化，更新列表项
        if (newIndex != currentIndex)
        {
            currentIndex = newIndex;
            UpdateItems();
        }
    }

    void UpdateItems()
    {
        // 更新每个列表项的位置和内容
        for (int i = 0; i < items.Count; i++)
        {
            int dataIndex = (currentIndex + i) % itemCount;
            items[i].anchoredPosition = new Vector2(0, -dataIndex * itemHeight);
            items[i].GetComponentInChildren<TextMeshProUGUI>().text = "Item " + dataIndex;
        }
    }
}